package cn.tedu.ivos.base.file;

import cn.tedu.ivos.base.response.JsonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 处理图片上传的控制器
 *
 * @author liyuehui
 * @time 2024/7/15 9:24
 */
@Slf4j
@Api(tags = "文件控制器")
@RestController
@RequestMapping("/v1/file")
public class UploadController {
    /**
     * 上传图片
     *
     * @param file 上传的图片文件
     * @return 上传成功返回图片路径, 上传失败返回null
     */
    @PostMapping("/upload")
    @ApiOperation("上传图片")
    public JsonResult upload(MultipartFile file) throws IOException {
        //MultipartFile用来接收上传图片文件的对象
        //注意:形参file必须与前端upload上传组件的name一致!
        //1.得到原始文件名
        String fileName = file.getOriginalFilename();
        log.info("上传的文件名:{}", fileName);
        //2.获取图片后缀名
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        log.info("图片后缀名:{}", suffix);
        //3.生成一个唯一不重复的随机字符串作为新的文件名
        fileName = UUID.randomUUID() + suffix;
        log.info("新的文件名:{}", fileName);
        //4.指定一个路径用来存储上传的图片文件,注意:这个路径必须自己电脑上有!
        String dirPath = "D:/ivos_upload";
        //5.为了提高检索性能我们可以设置一个自定义的日期路径作为图片存储的文件夹
        SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
        //6.将当前的实际日期转为上面的日期格式
        String datePath = sdf.format(new Date());
        log.info("日期格式:{}", datePath);
        //7.将上面的盘符路径与日期路径拼接成一个完成的图片存储文件夹路径
        File dirFile = new File(dirPath + datePath);
        if (!dirFile.exists()) {
            //如果文件夹不存在就创建
            dirFile.mkdirs();
        }
        //8.拼接成一个完成的图片路径
        String filePath = dirPath + datePath + fileName;
        //9.将图片保存在指定文件夹中
        file.transferTo(new File(filePath));
        //10.把日期路径+图片名响应给前端,前端拿到这个数据后再回显图片
        return JsonResult.ok(datePath + fileName);
    }

    /**
     * 删除图片
     *
     * @param imgUrl 上传的图片文件
     * @return JsonResult
     */
    @ApiOperation("删除图片")
    @PostMapping("remove")
    public JsonResult remove(String imgUrl) {
        log.debug("删除图片路径imgUrl:{}", imgUrl);
        new File("d:/ivos_upload" + imgUrl).delete();
        return JsonResult.ok();
    }
}
